//
// Created by sanfen on 2021/3/4.
//

#ifndef CHIP8_SIMULATOR_CHIP8_H
#define CHIP8_SIMULATOR_CHIP8_H
#include <QtWidgets>
#include <QtCore/QtCore>
#include <cstdint>
#include <cstdlib>
#include <stdio.h>
#include <cstring>
#include <ctime>
//储存内存大小
#define MEM_SIZE 4096
//屏幕高度
#define GFX_ROWS 32
//屏幕宽度
#define GFX_COLS 64
//像素个数
#define GFX_SIZE (GFX_ROWS*GFX_COLS)
//栈大小
#define STACK_SIZE 16
//按键大小
#define KEY_SIZE 16
//像素大小
#define PIXEL_SIZE 5
//CPU频率
#define CLOCK_HZ 60
//CPU周期
#define CLOCK_RATE_MS ((int) ((1.0/CLOCK_HZ)*1000+0.5))
//颜色
#define BLACK 0
#define WHITE 255
//屏幕行数
#define  SCREEN_ROWS (GFX_ROWS*PIXEL_SIZE)
//屏幕列数
#define  SCREEN_COLS (GFX_COLS*PIXEL_SIZE)
//屏幕索引
#define GFX_INDEX(row,col) ((row)*GFX_COLS+(COL))
//最大游戏文件大小
#define MAX_GAME_SIZE (0X1000-0X2000)

class CHIP8{
public:
    unsigned char screen[SCREEN_ROWS][SCREEN_COLS][3];
    /** opcode 指CPU指令  CHIP8共35个opcode,每一个是双字节长
     * TODO:0X000-0X1FF     -CHIP8 解释器（包含用于显示的字体）
     *      0x050-0X0A0     -用于生成4*5像素的字体集合（从0到F）
     *      0x200-0xFFF     -游戏ROM 工作RAM
     */
    unsigned short opcode;
    uint8_t memory[MEM_SIZE];
    /**
     * TODO:CPU寄存器，CHIP8 有16个单字节（1 byte）寄存器
     * 名字为V0....VF，前15个寄存器为通用寄存器
     * 最后一个寄存器（VF）是一个进位标志（carry flag）
     */
    uint8_t V[16];
    /*TODO:索引寄存器I（index register）
     * 程序计数器PC（program counter）
     */
    uint16_t I;
    uint16_t PC; //程序计数器
    uint8_t gfx[GFX_ROWS][GFX_COLS];
    //TODO:计数器
    uint8_t delay_timer;
    uint8_t sound_timer;

    //TODO:堆栈
    uint16_t stack[STACK_SIZE];
    uint16_t SP;
    //TODO:按键
    uint8_t key[KEY_SIZE];


     int screen_rows=SCREEN_ROWS;
     int screen_cols=SCREEN_COLS;
     int clock_rate_ms=CLOCK_RATE_MS;
     int clock_hz=CLOCK_HZ;
     int pixel_size=PIXEL_SIZE;

     char *name=(char*)"CHIP8";
     //绘图标志位
     bool draw_flag;
     //周期函数
     void runCycle();

     //加载游戏
     void loadGame(char* file_path);

     void debug_screen();

     void setkeys(int index,int state);
     //计时函数
     void tick();
     //绘制精灵
     void draw_sprite(uint8_t x,uint8_t y,uint8_t n);

     //打印当前状态
     void printState();

     //初始化CPU
     void initialize();

     //打印CPU信息
     void print_cpu_info();


};



#endif //CHIP8_SIMULATOR_CHIP8_H
